`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/07/05 17:36:36
// Design Name: 
// Module Name: register_pc
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module register_pc(
    clk,reset_n,data,zero,sextend_imm,op_pc,addr_ir
    );
    input clk;
    input reset_n;
    input zero;
    input [1:0] op_pc;
    input [31:0] data;
    input [31:0] sextend_imm;
    output reg [31:0] addr_ir;

    reg [31:0] addr;

    always @(posedge clk,negedge reset_n) begin
        if(~reset_n) 
            addr <= {{32{1'b1}},2'b0};
        else 
            addr <= addr_ir;
    end
    
    always @(*) begin
        if(op_pc==2'b01)
            addr_ir = addr + data;
        else if(op_pc==2'b10&&zero)
            addr_ir = addr + sextend_imm;
        else 
            addr_ir = addr + 32'b100;
    end
endmodule
